package aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TimeSpanAspect {
    private static final Logger log = LoggerFactory.getLogger(
            TimeSpanAspect.class);

    /**
     * 环绕增强
     */
    public Object around(ProceedingJoinPoint jp) throws Throwable {
        log.info("【环绕增强 - 前置】记录 {} 方法执行的开始时间。",
                jp.getSignature().getName());
// 进入方法之前记录开始时间
        long startTime = System.currentTimeMillis();
        try {
// 通过 proceed () 方法可以执行目标方法
            Object result = jp.proceed();
            log.info("【环绕增强 - 后置】{} 方法执行结果为 {}。",
                    jp.getSignature().getName(), result);
// 环绕增强要将结果返回
            return result;
        } catch (Throwable e) {
            log.info("【环绕增强 - 异常抛出】{} 方法执行异常信息为 {}。",
                    jp.getSignature().getName(), e.getMessage());
// 注意：不能隐瞒异常，需要抛出
            throw e;
        } finally {
// 在 finally 中记录结束时间，保证不管正常还是异常都能记录执行时间
            long endTime = System.currentTimeMillis();
            log.info("【环绕增强 - 最终】记录 {} 方法执行的结束时间，并计算耗时为 {} ms。",
                    jp.getSignature().getName(), (endTime - startTime));
        }
    }
}
